package com.moon.game.service;

import java.util.Properties;

import org.apache.log4j.Logger;

import com.mime.qweibo.OauthKey;
import com.moon.game.config.ConfigUtil;
import com.moon.game.vos.PlayerVo;
import com.qq.openmobile.examples.OpenSdkExample;
import com.tencent.wap.sdk.ChargeNotify;
import com.tencent.wap.sdk.OpenApiSdk;
import com.tencent.wap.sdk.PaymentInfo;
import com.tencent.wap.sdk.PaymentItem;
import com.tencent.wap.sdk.Person;
import com.tencent.wap.sdk.UserBalance;
/**
 * @description 腾讯开放平台服务
 * @author Ranger 作者 E-mail:haozi000005@163.com
 * @version 创建时间：2012-7-27 下午1:43:53
 */
public class OpenSdkService {
	private static final Logger log = Logger.getLogger(OpenSdkService.class);
	public static final String CONFIG_FILE_NAME = "sdk.properties";
	private static Properties busiProperties = new Properties();
	static {
		try {
			busiProperties = ConfigUtil.loadProperties(CONFIG_FILE_NAME);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static String customKey = getProperty("key","");//应用的key
	public static String customSecrect = getProperty("secrect", "");//应用secret
	public static int appId = getProperty("appid",186);
	public static String url = getProperty("api_url","");
	public static String ALL_FIELD = "id,nickname,displayName,birthday,bloodType,gender,yellow,sqq,sqqLevel,sqqType,gamevipLevel";//获取人物信息
	
	/**
	 * 获取配置
	 * 
	 * @param key
	 * @param defaultValue
	 * @return
	 */
	public static String getProperty(String key, String defaultValue) {
		if (key == null)
			return "";

		String v = busiProperties.getProperty(key);
		if (v == null || v.isEmpty())
			return defaultValue;
		else
			return v.trim();
	}
	
	public static int getProperty(String key, int defaultValue) {
		if (key == null) {
			return defaultValue;
		}
		String v = busiProperties.getProperty(key);
		if (v == null || v.isEmpty())
			return defaultValue;
		else {
			Integer i = Integer.valueOf(v);
			return i.intValue();
		}
	}
	
	public static final OauthKey getOauthKey() {
		OauthKey oauthKey = new OauthKey();
		oauthKey.appId = String.valueOf(appId);
		oauthKey.customKey = customKey;
		oauthKey.customSecrect = customSecrect;
		return oauthKey;
	}
	
	public static OauthKey getOauthKey(final String tokenKey, final String tokenSecrect) {
		OauthKey oauthParam = getOauthKey();
		oauthParam.tokenKey = tokenKey;
		oauthParam.tokenSecrect = tokenSecrect;
		return oauthParam;
	}
	
	
	public static Person getPlayer(final String tokenKey, final String tokenSecrect) {
		OpenApiSdk sdk = new OpenApiSdk();
		OauthKey oauthParam = getOauthKey(tokenKey, tokenSecrect);
		Person person = null;
		try{
			person = sdk.getSelf(oauthParam, url + "/people/@me/@self", ALL_FIELD, "json");
		}catch(Exception e) {
			e.printStackTrace();
		}
		
		return person;
	}
	
	/**
	 * 同步账户余额
	 * 
	 * @param playerId 人物id，用于记录日志
	 * @param tokenKey
	 * @param tokenSecrect
	 * @return 返回0表示没有可以同步的或者同步失败 ，返回其他为要给玩家增加的金币数量
	 */
	public static void syncGoldFromTencent(PlayerVo player) {
		OpenApiSdk sdk = new OpenApiSdk();
		OauthKey oauthParam = OpenSdkService.getOauthKey(player.getTokenKey(), player.getTokenSecrect());
		
		// 查询帐号内余额
		UserBalance balance = new UserBalance();
		int ret = sdk.getBalance(OpenSdkService.appId, oauthParam, OpenSdkService.url + "/payment/balance", null, balance);
		int money = balance.balance;
		if (ret == 0){
//			System.out.println("余额:" + balance.balance + " 状态:" + String.valueOf(balance.status));
			log.debug("balance:|" + balance.balance + "|statu:|" + String.valueOf(balance.status));
		}else{
			// 查询余额失败
			log.error("open get gold call failed!!");
			return;
		}
		
		// 扣除腾讯服务器上余额
		ChargeNotify notify = new ChargeNotify();
		PaymentInfo info = new PaymentInfo();
		PaymentItem item = new PaymentItem();
		
		String url = OpenSdkExample.URL_CHARGE;
		
		// 用于扣费后，如果需要用户密码确认，切换到用户与Tencent平台交互，成功扣费后，再通知应用服务发货。
    	//**注意平台可能返回需要用户输入验证码，如下面逻辑。该地址仅仅用于用户确认扣费后通知应用发货（交易成功情况下）。
		//验证需要用户输入密码情况请一定使用测试应用信息（demo里面配置的应用1）访问测试环境（openapi.sp0309.qq.com)
		//这样才能出现，在测试环境验证该功能就可以直接上正式环境，正式环境不用继续验证，正式环境也很难出现，与安全策略相关。
		//TODO:以后要修改地址
		info.setCallbackUrl("www.baidu.com");
		
		//***请注意，如果您需要知道在哪里处理某次交易是否成功或失败，就是靠这个finishPageUrl，平台在交易失败，成功，用户取消交易都会调用它。
        // 注意查看api文档相关流程说明
        // ***注意如果charge调用直接返回扣费成功，是不会使用这2个url的。
        //注意该2个url必须是外网可以访问的。
		//TODO:以后要修改地址
		info.setFinishPageUrl("www.baidu.com");
		item.setItemId("金币_0");
		item.setItemName("金币");
		item.setType("0");           //物品的类型。应用自己定义，平台不关注。
		item.setSubType("0");        //物品的子类型。应用自己定义，平台不关注。
		item.setUnitPrice(money);
		item.setQuantity(1);
		item.setGoodsId(-1);
		info.put(item);
		int iRet = sdk.charge(OpenSdkService.appId, oauthParam, info, url + "url", notify);
		if (iRet == 0) {
			if (notify.status == ChargeNotify.PayStatus.complete.toInt()) {
				// 扣费成功了，可以给用户发货了。
				log.debug("open charge succ:|" + player.getId() + "|" + money);
				log.debug("befor add gold:|" + player.getGold());
				//给玩家加钱
				if (money > 0) {
					PlayerService.doAddGold(player.getSid(), player.getId(), money);
					PlayerService.updatePlayerLog(player);
				}
				log.debug("after add gold:|" + player.getGold());
			} else if (notify.status == ChargeNotify.PayStatus.needpwd.toInt()) {
				// 需要用户密码确认，需要调用服务接口替用户打开密码确认界面
				log.debug("open charge succ:|" + player.getId() + "|" + money);
			} else {
				// 扣费失败
				log.debug("open charge failed:|" + player.getId() + "|" + money + "|status:|" + (notify.status == 7 ? "lack of money" :""));
			}
		} else {
			// 调用扣费失败
			log.error("open charge call failed!!");
		}
	}
	
	public static void main(String[] args) {
		System.out.println();
		OpenApiSdk sdk = new OpenApiSdk();
		OauthKey oauthParam = getOauthKey("577fc8a7bdf29d253b3fc2e3e21965bf199fa7fa4a26c394", "CCA87E3E31BD7AB97C3C8821");
		Person person = null;
		try{
			person = sdk.getSelf(oauthParam, url + "/people/@me/@self", ALL_FIELD, "json");
		}catch(Exception e) {
			e.printStackTrace();
		}
		System.out.println(person);
		
		
		//获取有多少钱
		UserBalance userBalance = new UserBalance();
		sdk.getBalance(appId, oauthParam, url + "/payment/balance", null, userBalance);
		int money = userBalance.balance;
		System.out.println("money:" + money);
		
	}
		//扣钱
		/*ChargeNotify notify = new ChargeNotify();
		PaymentInfo info = new PaymentInfo();
		PaymentItem item = new PaymentItem();
		
		String url = OpenSdkExample.URL_CHARGE;

        // 用于扣费后，如果需要用户密码确认，切换到用户与Tencent平台交互，成功扣费后，再通知应用服务发货。
    	//**注意平台可能返回需要用户输入验证码，如下面逻辑。该地址仅仅用于用户确认扣费后通知应用发货（交易成功情况下）。
		//验证需要用户输入密码情况请一定使用测试应用信息（demo里面配置的应用1）访问测试环境（openapi.sp0309.qq.com)
		//这样才能出现，在测试环境验证该功能就可以直接上正式环境，正式环境不用继续验证，正式环境也很难出现，与安全策略相关。
		info.setCallbackUrl("www.baidu.com");
        
        //***请注意，如果您需要知道在哪里处理某次交易是否成功或失败，就是靠这个finishPageUrl，平台在交易失败，成功，用户取消交易都会调用它。
        // 注意查看api文档相关流程说明
        // ***注意如果charge调用直接返回扣费成功，是不会使用这2个url的。
        //注意该2个url必须是外网可以访问的。
		info.setFinishPageUrl("www.baidu.com");
		item.setItemId("灵石_0");
		item.setItemName("灵石");
		item.setType("0");           //物品的类型。应用自己定义，平台不关注。
		item.setSubType("0");        //物品的子类型。应用自己定义，平台不关注。
		item.setUnitPrice(1);
		item.setQuantity(1);
		item.setGoodsId(-1);
		info.put(item);
		int iRet = sdk.charge(appId, oauthParam, info, url + "url", notify);
		if (iRet == 0) {
			if (notify.status == ChargeNotify.PayStatus.complete.toInt()) {
				// 扣费成功了，可以给用户发货了。
				System.out.println("扣费成功");
			} else if (notify.status == ChargeNotify.PayStatus.needpwd.toInt()) {
				// 需要用户密码确认，需要调用服务接口替用户打开密码确认界面
				//
				url = OpenSdkExample.URL_TRANSCACTION;
				System.out.println("待确认");
			} else {
				System.out.println("charge failed,status:（扣费失败！）" + String.valueOf(notify.status));
			}
		} else {
			System.out.println("charge failed");
		}
	}*/
}
